package com.baidu.aip.unit;

import java.util.HashMap;
import java.util.Map;

import com.baidu.aip.unit.model.response.BotMergedSlots;
import com.baidu.aip.unit.model.response.CommunicateResponse;
import com.baidu.aip.unit.utils.TextUtils;

/**
 * UNIT JSON response的简单包装类，方便获取最关心的语义解析结果信息
 * @author hling
 *
 */
public class SimpleResponseWrapper {
	
	private CommunicateResponse response;
	
	private Map<String, String> slotNormalizedWords = new HashMap<>();
	private Map<String, String> slotOriginalWords = new HashMap<>();

	public SimpleResponseWrapper(CommunicateResponse response) {
		this.response = response;
		
		for (BotMergedSlots slot : response.getSchema().getBotMergedSlots()) {
			String normalWord = TextUtils.isEmpty(slot.getNormalizedWord())?slot.getOriginalWord():slot.getNormalizedWord();
			String originWord = slot.getOriginalWord();
			slotNormalizedWords.put(slot.getType(), normalWord);
			slotOriginalWords.put(slot.getType(), originWord);
		}
	}
	
	/**
	 * 获取动作Action数量
	 * @return
	 */
	public int getActionCount() {
		return response.getActionList().size();
	}
	
	/**
	 * 获取第N个动作的回复文本内容
	 * @param index 动作索引，基于0
	 * @return 第N个动作的回复文本内容
	 */
	public String getSay(int index) {
		return response.getActionList().get(index).getSay();
	}

	/**
	 * 获取第N个动作的执行函数名
	 * @param index 动作索引，基于0
	 * @return 第N个动作的执行函数名
	 */
	public String getExe(int index) {
		return response.getActionList().get(index).getMainExe();
	}
	
	/**
	 * 第N个动作的类型是否为"满足"
	 * @param index 动作索引，基于0
	 * @return 是否满足
	 */
	public boolean isSatisfied(int index) {
		return "satisfy".equals(response.getActionList().get(index).getActionType().getActType());
	}
	
	/**
	 * 判断第N个动作是执行函数还是回复文本内容
	 * @param index 动作索引，基于0
	 * @return 如果是执行函数，返回true，否则返回false
	 */
	public boolean isCallFunc(int index) {
		return TextUtils.isEmpty(getSay(index));
	}
	
	/**
	 * 获取第一个动作的回复文本内容
	 */
	public String getSay() {
		return getSay(0);
	}

	/**
	 * 获取第一个动作的执行函数名
	 */
	public String getExe() {
		return getExe(0);
	}
	
	/**
	 * 获取第一个动作的类型是否为"满足"
	 */
	public boolean isSatisfied() {
		return isSatisfied(0);
	}

	/**
	 * 判断第一个动作是执行函数还是回复文本内容
	 */
	public boolean isCallFunc() {
		return TextUtils.isEmpty(getSay(0));
	}
	
	/**
	 * 当前意图。如果没有成功匹配意图，返回空字符串。
	 * @return 意图名
	 */
	public String getCurrentIntent() {
		return response.getSchema().getCurrentQuIntent();
	}
	
	/**
	 * 返回当前词槽，key是词槽名，value是词槽归一后的值。<br>
	 * 从实际返回数据看，如果原始词槽值等于归一值，则JSON中此字段为空，
	 * 但本函数会把原始词槽值当做归一值返回，确保返回不为空。
	 */
	public Map<String, String> getSlotNormalizedWords() {
		return slotNormalizedWords;
	}

	/**
	 * 返回当前词槽，key是词槽名，value是原始词槽值
	 */
	public Map<String, String> getSlotOriginalWords() {
		return slotOriginalWords;
	}

	@Override
	public String toString() {
		return "[返回报文摘要] " +(isCallFunc()?"执行函数：" + getExe():"回复文本：" + getSay())
			+ ", 当前意图：" + getCurrentIntent() + ", 当前槽值：" + slotNormalizedWords.toString();
	}

}
